//
//  CZUserAccountViewModel.swift
//  iOSWeibo10
//
//  Created by ge on 16/5/13.
//  Copyright © 2016年 ge. All rights reserved.
//

import UIKit

// 处理模型相关的操作, 请求数据,字典转模型, 保存模型, 加载模型
class CZUserAccountViewModel: NSObject {
    
    // 单例
    static let sharedInstance: CZUserAccountViewModel = CZUserAccountViewModel()
    
    // 账号归档和解档的路径
    let userAccountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
    
    /// 账号,全局只要拿到单例就可以访问,别人在任何都可以访问账号
    var userAccount: CZUserAccount?
    
    /// 用户是否登录的属性
    var isUserLogin: Bool {
        get{
            return userAccount != nil  // 账号!=nil就表示登录了
        }
    }
    
    override init() {
        super.init()
        // 单例创建的时候就会加载沙盒里面的账号,赋值给userAccount, 只需要加载一次
        userAccount = loadUserAccount()
    }
    
    // 发送POST请求获取AccessToken
    func loadAccessToken(code: String, callback: (error: NSError?) -> ()) {
        // 发送POST请求获取AccessToken
        // 如果urlString里面开头是http或https就直接使用这个urlString,如果不是以http或https开头AFN会帮我们拼接baseURL
        let urlString = "oauth2/access_token"
        
        //参数
        let parameters = [
            "client_id" : client_id,
            "client_secret" : client_secret,
            "grant_type" : "authorization_code",
            "code" : code,
            "redirect_uri": redirect_uri
        ]
        
        // 如果已经授权成功消息在授权的时候不会再看到这个界面,相当于新浪会自动帮我们点击授权按钮,
        // 如果还想自己来收取需要去网站上面取消授权
        CZNetworkTool.sharedInstance.request(RequestMethod.POST, URLString: urlString, parameters: parameters, success: { (task, responseObject) -> Void in
            CZPrint(items: "获取AccessToken成功: \(responseObject)")
            
            // 判断返回的数据是否能够转成字典
            if let result = responseObject as? [String: AnyObject]{
                // 字典转模型
                let userAccount = CZUserAccount(dict: result)
                CZPrint(items: "userAccount: \(userAccount)")
                
                let userAccountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
                CZPrint(items: "userAccountPath: \(userAccountPath)")
                
                // 将账号赋值给属性
                self.userAccount = userAccount
                
                // 调用归档的方法,将模型归档到沙盒里面
                // 让userAccount对象保存到self.userAccountPath这个路径
                self.saveUserAccount()
                
                
                // 告诉控制器,模型保存完成了
                callback(error: nil)
            }else{
                CZPrint(items: "返回数据转字典失败了")
            }
            
            }, failure: { (task, error) -> Void in
                CZPrint(items: "失败了: \(error)")
                callback(error: error)
        })
    }
    
    // 保存账号到沙盒中
    private func saveUserAccount() {
        // 调用归档的方法,将模型归档到沙盒里面
        // 让userAccount对象保存到self.userAccountPath这个路径
        if let account = userAccount {
            NSKeyedArchiver.archiveRootObject(account, toFile: self.userAccountPath)
        }
        
    }
    
    // 解档账号
    private func loadUserAccount() -> CZUserAccount?
    {
        // 解档对象
        // 从self.userAccountPath文件里面加载账号
        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(self.userAccountPath) as? CZUserAccount {
            // 加载到了账号, 判断是否过期
            // userAccount.expiresDate 和当前时间比较
            // NSDate(): 当前时间
            // userAccount.expiresDate < NSDate() 过期的
            // 测试:1.改系统时间 2.改userAccount.expiresDate属性,早期的时间
//            userAccount.expiresDate = NSDate(timeIntervalSinceNow: -1000)
            if userAccount.expiresDate?.compare(NSDate()) != NSComparisonResult.OrderedAscending
            {
                // 没有过期
//                CZPrint(items: "没有过期")
                return userAccount
            } else {
                return nil
            }
        } else {
            // 没有加载出账号
            return nil
        }
    }
    
    // MARK: - 获取用户名称和头像
    /**
    加载用户信息,用户名称和头像
    */
    func loadUserInfo(loadUserInfoCallback: () -> ()) {

        // 可选绑定会造成嵌套层次很多, swift提供了另外一种形式,守卫 guard
        // guard正好相反
        guard let access_token = userAccount?.access_token else {
            // 能到里面来说明access_token没有值
            CZPrint(items: "access_token没有值")
            return
        }
        // access_token有值可以在后面继续使用
        
        guard let uid = userAccount?.uid else {
            // 能到这里面来说明uid没有值
            CZPrint(items: "uid没有值")
            return
        }
        // uid有值,可以在后面使用uid
        
        // 1.看API
        
        // 2.urlString
        let urlString = "2/users/show.json"
        
        // 3.参数
        let parameters = [
            "access_token": access_token,
            "uid": uid
        ]
        
        // 4.发送请求
        CZNetworkTool.sharedInstance.request(RequestMethod.GET, URLString: urlString, parameters: parameters, success: { (_, responseObject) -> Void in
            // 5.请求成功
//            CZPrint(items: "获取用户信息: \(responseObject)")
            
            if let result = responseObject as? [String: AnyObject] {
                // 只需要用户的名称和头像地址
                let screen_name = result["screen_name"] as? String
                let avatar_large = result["avatar_large"] as? String
                
                // 赋值到当前账号的模型中
                self.userAccount?.screen_name = screen_name
                self.userAccount?.avatar_large = avatar_large
                
                // 将userAccount保存到沙盒中
                self.saveUserAccount()
                
                // 让欢迎界面显示信息, 通过闭包回调
                
            }
            
            }) { (_, error) -> Void in
                //6.请求失败
                CZPrint(items: "获取用户信息出错了: \(error)")
        }
    }

}






